import 'package:get/get.dart';
import '../../data/models/user_model.dart';
import '../../data/repositories/auth_repository.dart';
import '../../../core/base/base_service.dart';
import '../../../core/errors/failures.dart';

/// 认证业务服务
/// 封装认证相关的核心业务逻辑
class AuthBusiness {
  // 注入认证仓库
  final AuthRepository _authRepository = Get.find<AuthRepository>();

  /// 处理用户登录
  /// 
  /// 接收邮箱和密码，调用仓库进行登录。
  /// 成功返回 UserModel，失败抛出业务异常或传递仓库异常。
  Future<UserModel> performLogin(String email, String password) async {
    // 可以在这里添加额外的业务规则，例如：
    // - 登录频率限制检查
    // - 输入格式预处理等
    
    try {
      // 调用仓库执行登录
      final user = await _authRepository.login(email, password);
      
      // 可以在登录成功后触发一些业务事件，例如：
      // - 更新用户分析属性
      // - 清理旧的会话数据等
      
      return user;
    } catch (e) {
      // 可以根据仓库抛出的异常类型进行转换或记录
      // 例如，将特定的仓库异常转换为更通用的业务层异常
      print('AuthBusiness - Login failed: $e');
      rethrow; // 将异常继续抛出给调用者（通常是 Controller）处理
    }
  }

  /// 处理用户注册
  Future<UserModel> performRegistration(String name, String email, String password) async {
    // 可以在这里添加注册前的业务检查
    // 例如：检查用户名是否符合规范、密码强度等
    if (password.length < 8) {
      throw Exception('密码强度不足，至少需要8位');
    }
    
    try {
      final user = await _authRepository.register(name, email, password);
      // 注册成功后的业务逻辑，例如发送欢迎邮件（如果后端未处理）
      return user;
    } catch (e) {
      print('AuthBusiness - Registration failed: $e');
      rethrow;
    }
  }

  /// 处理发送密码重置邮件
  Future<void> requestPasswordReset(String email) async {
    try {
      await _authRepository.sendPasswordResetEmail(email);
      // 发送成功后的业务逻辑
    } catch (e) {
      print('AuthBusiness - Password reset request failed: $e');
      rethrow;
    }
  }

  /// 处理用户退出登录
  Future<void> performLogout() async {
    try {
      await _authRepository.logout();
      // 退出成功后的业务逻辑，例如清除所有用户相关状态
    } catch (e) {
      print('AuthBusiness - Logout failed: $e');
      // 登出失败通常不需要向上抛出严重错误，记录日志即可
    }
  }

  /// 检查当前登录状态
  Future<bool> checkLoginStatus() async {
    return await _authRepository.isLoggedIn();
  }

  /// 获取当前登录用户信息
  Future<UserModel?> fetchCurrentUser() async {
    return await _authRepository.getCurrentUser();
  }
  
  /// 尝试刷新认证 Token
  Future<bool> attemptTokenRefresh() async {
    return await _authRepository.refreshAuthToken();
  }
} 